package infra

import (
	"gitee.com/slion/helper"
	"github.com/tietang/props/kvs"
)

// 应用程序启动管理器
type BootApplication struct {
	iniConf kvs.ConfigSource
	startContext StartContext
}

// 初始化启动管理器
func New(iniConf kvs.ConfigSource) *BootApplication{
	app := &BootApplication{
		iniConf: iniConf,
		startContext: StartContext{},
	}
	// 配置添加到基础资源上下文里
	app.startContext[helper.MapKeyConf] = iniConf
	return app
}

// 启动方法
func (boot *BootApplication) Start(){
	// 1. 初始化starter
	boot.init()
	// 2. 安装starter
	boot.setup()
	// 3. 启动starter
	boot.start()
}

func (boot *BootApplication) init(){
	for _, starter := range StartRegister.AllStarters() {
		starter.Init(boot.startContext)
	}
}

func (boot *BootApplication) setup(){
	for _, starter := range StartRegister.AllStarters() {
		starter.Setup(boot.startContext)
	}
}

func (boot *BootApplication) start(){

	// 所有的starter
	starters := StartRegister.AllStarters()
	for i, starter := range starters {

		// 如果starter是阻塞的
		if starter.StartBlocking() {
			if i + 1 != len(starters){ // 如果不是最后一个可阻塞的,使用goroutine启动
				go starter.Start(boot.startContext)
				continue
			}
		}
		// 不是可阻塞的,或者最后一个可阻塞的,直接启动
		starter.Start(boot.startContext)
	}
}